-- 禁用 Ctrl-m 变成回车，设置成别的功能，但会让回车键回车失效，取消这几行 C-m 又不是回车了
vim.api.nvim_set_keymap("n", "<C-m>", "<Nop>", { noremap = true, silent = true })
vim.api.nvim_set_keymap("i", "<C-m>", "<Nop>", { noremap = true, silent = true })
vim.api.nvim_set_keymap("v", "<C-m>", "<Nop>", { noremap = true, silent = true })

local keymap = vim.keymap

-- 设置主键
vim.g.mapleader = " "
vim.g.maplocalleader = " "

-- ╭─────────────────────────────────────────────────────────╮
-- │                         插入模式                        │
-- ╰─────────────────────────────────────────────────────────╯

-- 连续输入 jk 替换 ESC 键
keymap.set("i", "jk", "<ESC>")

-- 移动光标
keymap.set("i", "<C-h>", "<Left>")
keymap.set("i", "<C-l>", "<Right>")
keymap.set("i", "<C-j>", "<Down>")
keymap.set("i", "<C-k>", "<Up>")

-- ╭─────────────────────────────────────────────────────────╮
-- │                         可视模式                        │
-- ╰─────────────────────────────────────────────────────────╯

-- 单行或多行移动，按 v 进入可视模式后按 j/k 上下选中多行，按 shift + j/k 可移动
keymap.set("v", "J", ":m '>+1<CR>gv=gv", { desc = "Move down line" })
keymap.set("v", "K", ":m '<-2<CR>gv=gv", { desc = "Move up line" })

-- ╭─────────────────────────────────────────────────────────╮
-- │                         命令模式                        │
-- ╰─────────────────────────────────────────────────────────╯

-- 连续输入 jk 替换 ESC 键
keymap.set("c", "jk", "<ESC>")

-- ╭─────────────────────────────────────────────────────────╮
-- │                         普通模式                        │
-- ╰─────────────────────────────────────────────────────────╯

-- 进入命令模式，, 替换 :
keymap.set("n", ",", ":", { noremap = true, nowait = true })

-- shift + h/l 移动光标到行首/行尾
keymap.set({ "n", "x" }, "<S-H>", "^", { desc = "Start of line" })
keymap.set({ "n", "x" }, "<S-L>", "$", { desc = "End of line" })

-- 按 y 后按 shift + h/l 复制到行首/行尾
keymap.set("n", "y<S-H>", "y^", { desc = "Yank from start of line" })
keymap.set("n", "y<S-L>", "y$", { desc = "Yank to end of line" })

-- 切换 buffer
keymap.set("n", "<C-L>", ":bnext<CR>")
keymap.set("n", "<C-H>", ":bprevious<CR>")

--============ 窗口 ============
-- 水平新增窗口，按 mapleader 键（空格）后按 hw
keymap.set("n", "<leader>hw", "<C-w>v", { desc = "Horizontal New Window" })
-- 垂直新增窗口，按 mapleader 键（空格）后按 vw
keymap.set("n", "<leader>vw", "<C-w>s", { desc = "Vertical New Window" })

-- 切换窗口
keymap.set("n", "<C-h>", "<C-w>h")
keymap.set("n", "<C-l>", "<C-w>l")
keymap.set("n", "<C-j>", "<C-w>j")
keymap.set("n", "<C-k>", "<C-w>k")

-- 取消高亮
-- 搜索时会高亮目标，且不会自动取消高亮
keymap.set("n", "<leader>nh", ":nohl<CR>", { desc = "No Highlight" })

keymap.set({ "n", "x" }, "Q", "<CMD>:qa<CR>")
keymap.set({ "n", "x" }, "qq", "<CMD>:q<CR>")

-- 换行切换
keymap.set("n", "<A-z>", "<CMD>set wrap!<CR>", { desc = "Toggle line wrap" })
